package student.aistar.day16;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 反射技术来操作属性 (二)
 */
public class FieldDemo {
    public static void main(String[] args) throws Exception {
        //1. 获取Point的Class实例
        Class<?> c = Point.class;

        //2. Field getDeclaredField(String name);
        //根据属性的名称来得到Field对象

        Field x = c.getDeclaredField("y");

        //通过File对象来获取属性的信息
        //反射技术可以动态获取[程序运行期间]属性的信息
        //修饰符, 数据类型 属性名称

        //1. 获取修饰符
        //默认的 - 0
        //public - 1
        //private - 2
        //private - 4
        int n = x.getModifiers();
        System.out.println(Modifier.toString(n) + " ");

        //2. 获取属性的数据类型
        Class<?> xType = x.getType();
        //System.out.println(xType);//int / class java.lang.String
        //希望打印出来的就是类的全限定类名 - java.lang.String
        //String xName = xType.getName();
        //System.out.println(xName);//java.lang.String


        //3. 获取类型的简称
        System.out.println(xType.getSimpleName() + " ");//String

        //4. 属性的名称
        System.out.println(x.getName());//y
        System.out.println("======反射设置属性的值=======");
        //属性已经进行了封装 - private - 外界是不能够直接对属性进行直接操作setter/构造  getter来取值
        //对私有的属性进行了一个设置

        //
        Point p = new Point();

        //强制通过反射的技术来让私有的属性对外界可访问, 否则如果没有设置.  - 抛出java.lang.IllegalAccessException
        //在操作之前, 设置一下属性的可访问
        //反射是可以破坏封装的
        //私有的成员在反射技术面前都是出于一种"裸奔"
        x.setAccessible(true);
        x.set(p, "tome");

        System.out.println(p);//Point{x=0, y='tome'}


    }
}
